package main

import "fmt"

type Animal interface {
	Sleep()
	GetColor() string
	GetType() string
}

type Cat struct {
	Color string
}

type Dog struct {
	Color string
}

// 实现全部方法就能继承接口
func (cat *Cat) Sleep() {
	fmt.Println("cat ", cat.GetColor(), " is sleeping")
}

func (cat *Cat) GetColor() string {
	return cat.Color
}

func (cat *Cat) GetType() string {
	return "cat"
}

func (dog *Dog) Sleep() {
	fmt.Println("dog sleeping")
}

func (dog *Dog) GetColor() string {
	return dog.Color
}

func (dog *Dog) GetType() string {
	return "dog"
}

func showAnimal(animal Animal) {
	animal.Sleep()
}

// 万能接口类型  类似于java中的object
func object(arg interface{}) {
	//fmt.Println(arg)
	// 接口类型断言语法
	value, ok := arg.(string)
	if ok {
		fmt.Println("arg is string, value = ", value)
	} else {
		// 这时候value是空 nil
		fmt.Println("arg is not string, value = ", value, ",arg is ", arg)
	}

}
func main12() {
	cat := Cat{"green"}
	dog := Dog{"yellow"}

	var animal Animal
	// 接口的本质是指针 通过指针来实现多态
	animal = &cat
	// 也能这样直接赋值
	// animal1 := &dog
	animal.Sleep()
	animal = &dog
	animal.Sleep()

	cat = Cat{"white"}
	// warning ： 也可以直接接口指针直接传入函数
	showAnimal(&cat)

	object("aaa")
	object(123)
	object(1.23)
	object(animal)

}
